package com.fin.quant.domain.service.impl;

import com.fin.quant.instra.mysql.mapper.UserAccountMapper;
import com.fin.quant.instra.mysql.model.UserAccount;
import com.fin.quant.domain.service.UserDomainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 用户领域服务
 */
@Service
public class UserDomainServiceImpl implements UserDomainService {

    @Autowired
    private UserAccountMapper userAccountMapper;

    /**
     * 根据用户名或邮箱或手机号查询用户
     */
    public UserAccount findByLoginName(String loginName) {
        if (StringUtils.isEmpty(loginName)) {
            return null;
        }
        
        // 先尝试按用户名查询
        UserAccount user = userAccountMapper.findByUsername(loginName);
        if (user != null) {
            return user;
        }
        
        // 再尝试按邮箱查询
        user = userAccountMapper.findByEmail(loginName);
        if (user != null) {
            return user;
        }
        
        // 最后尝试按手机号查询
        return userAccountMapper.findByPhone(loginName);
    }

    /**
     * 根据ID查询用户
     */
    public UserAccount findById(Long userId) {
        return userAccountMapper.findById(userId);
    }

    /**
     * 验证密码
     */
    public boolean validatePassword(String inputPassword, String storedPasswordHash, String salt) {
        // 简单的密码验证，实际项目中应该使用BCrypt等安全算法
        String hashedInput = simpleHash(inputPassword, salt);
        return hashedInput.equals(storedPasswordHash);
    }

    /**
     * 更新最后登录信息
     */
    public void updateLastLogin(Long userId, String loginIp) {
        userAccountMapper.updateLastLogin(userId, LocalDateTime.now().toString(), loginIp);
    }

    /**
     * 简单的哈希算法（仅用于演示，生产环境应使用BCrypt）
     */
    private String simpleHash(String password, String salt) {
        return String.valueOf((password + salt).hashCode());
    }

    /**
     * 生成盐值
     */
    private String generateSalt() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 检查用户状态是否正常
     */
    public boolean isUserActive(UserAccount user) {
        return user != null && "ACTIVE".equals(user.getStatus());
    }

    /**
     * 创建新用户
     * @param userAccount
     * @return
     */
    public int save(UserAccount userAccount){
        return userAccountMapper.insert(userAccount);
    }
}
